package com.zzy.algorithm.stack;

import java.util.Stack;

/**
 * LeetCode - 394 ：字符串解码
 *
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 *
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
 *
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 *
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 *
 * 输入：s = "3[a2[c]]"
 * 输出："accaccacc"
 *
 */
public class Q17_EncodeString {

    public static void main(String[] args) {
        Q17_EncodeString q17_encodeString = new Q17_EncodeString();
        String solution = q17_encodeString.solution("3[a2[c]]");
        System.out.println("solution = " + solution);
    }

    private String solution(String s){
        String result = "";
        Stack<Integer> numberStack = new Stack<>();
        Stack<String> strStack = new Stack<>();
        int i = 0;
        while(i < s.length()){
            char curr = s.charAt(i);
            if(Character.isDigit(curr)){
                StringBuffer numberStr = new StringBuffer();
                while(Character.isDigit(s.charAt(i))){
                    numberStr.append(s.charAt(i++));
                }
                numberStack.push(Integer.valueOf(numberStr.toString()));
            } else if(Character.isLetter(curr)){
                result = result + s.charAt(i++);
            } else if(curr == '['){
                strStack.push(result);
                result = "";
                i++;
            } else {
                Integer number = numberStack.pop();
                String str = strStack.pop();
                StringBuffer sb = new StringBuffer(str);
                for(int k = 0 ; k < number ; k++){
                    sb.append(result);
                }
                result = sb.toString();
                i++;
            }
        }

        return result;
    }

}